package com.munhrasoft.dinamica.managedbeans;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.SelectEvent;
import org.primefaces.event.TabChangeEvent;

import com.munhrasoft.dinamica.business.entities.CheckListHeader;
import com.munhrasoft.dinamica.business.entities.CheckListLines;
import com.munhrasoft.dinamica.business.logic.CheckListEJB;

@ManagedBean
@ViewScoped
public class CheckListController {

    /*
     * Acho que nao vai precisar de ficar inicializando direto os objetos como no exemplo do
     * tabchanged, acho que quem anulava o objeto de pesquisa era o datatable
     */

    private static Logger         logger          = Logger.getLogger(CheckListController.class
                                                          .getName());

    @EJB
    private CheckListEJB          checkListEJB;

    private CheckListHeader       chkHeader       = new CheckListHeader();
    private CheckListHeader       pesqchkHeader   = new CheckListHeader();
    private CheckListHeader       reschkHeader    = new CheckListHeader();

    private CheckListLines        selectedChkLine = new CheckListLines();
    private List<CheckListHeader> chkHeaderList   = new ArrayList<CheckListHeader>();

    @PostConstruct
    public void init() {
        logger.info("PostConstruct");
        chkHeaderList = checkListEJB.fetchAllChkList();
        pesqchkHeader = new CheckListHeader();
        chkHeader = new CheckListHeader();
        reschkHeader = new CheckListHeader();
    }

    public void createChkHeader(ActionEvent actionEvent) {
        chkHeader = checkListEJB.createChkHeader(chkHeader);
        chkHeader = new CheckListHeader();
        pesqchkHeader = new CheckListHeader();
        showMessage(FacesMessage.SEVERITY_INFO, "Operação concluída",
                "CheckList criado com sucesso");
    }

    public void pegarTodosChkList(ActionEvent actionEvent) {
        chkHeaderList = checkListEJB.fetchAllChkList();

        if (!chkHeaderList.isEmpty()) {
            pesqchkHeader = chkHeaderList.get(0);
        } else {
            // TODO escreve uma mensagem de warning falando que a busca nao
            // retornou nada.
        }

    }

    public void adicionaChkLine(ActionEvent actionEvent) {
        logger.info("Adiciona linha no check list");
        reschkHeader.getCheckLines().add(new CheckListLines());
        showMessage(FacesMessage.SEVERITY_INFO, "Operação concluída",
                "Linha adicionada com sucesso");

    }

    public void removeLinha(ActionEvent actionEvent) {
        logger.info("Remove linha");
        if (selectedChkLine != null) {
            reschkHeader.getCheckLines().remove(selectedChkLine);
        } else {
            showMessage(FacesMessage.SEVERITY_INFO, "Operação concluída",
                    "Linha removida com sucesso");

        }
    }

    public void saveCheckList(ActionEvent actionEvent) {
        pesqchkHeader = checkListEJB.updateCheckListHeader(pesqchkHeader);
        if (pesqchkHeader != null) {
            showMessage(FacesMessage.SEVERITY_INFO, "Operação concluída",
                    "CheckList atualizado com sucesso");
        } else {
            showMessage(FacesMessage.SEVERITY_ERROR, "Erro", "O CheckList não foi atualizado");
        }
    }

    public void removeCheckList(ActionEvent actionEvent) {
        if (pesqchkHeader != null) {
            checkListEJB.removeCheckListHeader(pesqchkHeader);
            chkHeaderList = checkListEJB.fetchAllChkList();
            pesqchkHeader = new CheckListHeader();
            showMessage(FacesMessage.SEVERITY_INFO, "Operação concluída",
                    "Check List removido com sucesso");
        } else {
            showMessage(FacesMessage.SEVERITY_ERROR, "Operação falhou", "Cliente não selecionado");
        }

    }

    public void handleFileUpload(FileUploadEvent event) {

        logger.info("handleFileUpload file name " + event.getFile().getFileName());

        try {
            checkListEJB.carregaCheckListDoExcel(event.getFile().getInputstream());
        } catch (IOException e) {
            e.printStackTrace();
            showMessage(FacesMessage.SEVERITY_ERROR, "Operação falhou",
                    "Erro ao carregar o arquivo");
        }
        showMessage(FacesMessage.SEVERITY_INFO, "Operação concluída",
                "Arquivo de checklist carregado");

    }

    public CheckListHeader getChkHeader() {
        return chkHeader;
    }

    public void setChkHeader(CheckListHeader chkHeader) {
        this.chkHeader = chkHeader;
    }

    public CheckListHeader getPesqchkHeader() {
        return pesqchkHeader;
    }

    public void setPesqchkHeader(CheckListHeader pesqchkHeader) {
        this.pesqchkHeader = pesqchkHeader;
    }

    public CheckListHeader getReschkHeader() {
        return reschkHeader;
    }

    public void setReschkHeader(CheckListHeader reschkHeader) {
        this.reschkHeader = reschkHeader;
    }

    public CheckListLines getSelectedChkLine() {
        return selectedChkLine;
    }

    public void setSelectedChkLine(CheckListLines selectedChkLine) {
        this.selectedChkLine = selectedChkLine;
    }

    public List<CheckListHeader> getChkHeaderList() {
        return chkHeaderList;
    }

    public void setChkHeaderList(List<CheckListHeader> chkHeaderList) {
        this.chkHeaderList = chkHeaderList;
    }

    public void rowSelect(SelectEvent event) {
        logger.info("Row select");
        pesqchkHeader = reschkHeader;

    }

    public void changeTabView(TabChangeEvent event) {
        logger.info("Tabview changed " + event.getTab().getId());
        chkHeaderList = checkListEJB.fetchAllChkList();

        pesqchkHeader = new CheckListHeader();
        chkHeader = new CheckListHeader();
    }

    private void showMessage(Severity sev, String summary, String detail) {
        FacesMessage message = new FacesMessage(sev, summary, detail);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

}
